﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace ParticlesSettings
{
    /// <summary>
    /// 用来指定粒子系统的加速度
    /// </summary>
    public enum AccelerationMode
    {
        /// <summary>
        /// 不使用加速度。
        /// </summary>
        None,

        /// <summary>
        /// 粒子系统使用MinAccelerationScale和MaxAccelerationScale的值计算一个加速度随机标量，
        /// 然后将这个值乘以粒子的运动方向。
        /// </summary>
        Scalar,

        /// <summary>
        /// 粒子系统使用EndVelocity的值计算加速度，根据公式vt = v0 + (a0 * t)求出a0，详见Particle2DSystem.cs。
        /// </summary>
        EndVelocity,

        /// <summary>
        /// 粒子系统使用MinAccelerationVector和MaxAccelerationVector的值计算一个加速度随机矢量作为粒子的加速度。
        /// </summary>
        Vector
    }

    /// <summary>
    /// Particle2DSettings类包含了所有控制2D粒子系统外观的可调整参数。
    /// 其中许多参数有一个optional的属性，这样它们就可以使用默认值，XML文件得以简化。
    /// </summary>
    public class Particle2DSettings
    {
        // 设置粒子效果使用的粒子数量的范围
        public int MinNumParticles;
        public int MaxNumParticles;

        // 粒子系统使用的纹理名称。  
        public string TextureFilename = null;

        // MinDirectionAngle和MaxDirectionAngle用来控制粒子的运动方向。
        // 为了更容易构建XML文件，使用的是角度而不是弧度。
        // Particle2DSystem会根据需要转换为弧度。
        [ContentSerializer(Optional = true)]
        public float MinDirectionAngle = 0;
        [ContentSerializer(Optional = true)]
        public float MaxDirectionAngle = 360;
                
        // MinInitialSpeed和MaxInitialSpeed用来控制粒子的初始速度。      
        public float MinInitialSpeed;
        public float MaxInitialSpeed;

        // 设置计算粒子加速度的模式。
        public AccelerationMode AccelerationMode = AccelerationMode.None;

        // 控制粒子速度的变化方式。 
        // 如果设置为1，粒子为匀速运动。设置为0，粒子静止。
        // 这个值大于1则粒子一直做加速运动。在使用AccelerationMode.EndVelocity模式时这个值才会起作用。
        [ContentSerializer(Optional = true)]
        public float EndVelocity = 1f;

        // 当使用AccelerationMode.Scalar时，控制粒子的最大和最小加速度。
        [ContentSerializer(Optional = true)]
        public float MinAccelerationScale = 0;
        [ContentSerializer(Optional = true)]
        public float MaxAccelerationScale = 0;

        // 当使用AccelerationMode.Vector时，控制粒子的最大和最小加速度。
        [ContentSerializer(Optional = true)]
        public Vector2 MinAccelerationVector = Vector2.Zero;
        [ContentSerializer(Optional = true)]
        public Vector2 MaxAccelerationVector = Vector2.Zero;

        // 控制产生粒子的对象的速度对粒子的影响程度。
        // AddParticles方法有一个Vector2类型的输入参数：base velocity,
        // 这个速度首先乘以EmitterVelocitySensitivity确定粒子被这个速度影响程度，默认为0，即不受影响。
        [ContentSerializer(Optional = true)]
        public float EmitterVelocitySensitivity = 0;

        // 控制粒子的最大和最小旋转速度，单位为角度。
        [ContentSerializer(Optional = true)]
        public float MinRotationSpeed = 0;
        [ContentSerializer(Optional = true)]
        public float MaxRotationSpeed = 0;
                
        // 控制粒子的生存时间。
        public float MinLifetime;
        public float MaxLifetime;

        // 控制粒子的大小。
        [ContentSerializer(Optional = true)]
        public float MinSize = 1;
        [ContentSerializer(Optional = true)]
        public float MaxSize = 1;
                
        // 控制粒子的重力加速度。
        // 它将粒子向下运动模拟重力的影响。
        // 对烟雾来说这个方向是向上的，也可以是其他方向。        
        [ContentSerializer(Optional = true)]
        public Vector2 Gravity = Vector2.Zero;

        // Alpha混合设置。默认值是BlendState.AlphaBlend，适用于大多数粒子系统。
        [ContentSerializer(Optional = true)]
        public Blend SourceBlend = Blend.One;
        [ContentSerializer(Optional = true)]
        public Blend DestinationBlend = Blend.InverseSourceAlpha;

        // 绘制顺序，默认为1，即首先绘制
        [ContentSerializer(Optional = true)]
        public int DrawOrder=1;
    }
}
